// 假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示，
// 其中h是这个人的身高，k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。

// 注意：
// 总人数少于1100人。

const reconstructQueue = function (people: number[][]): number[][] {
    let res: number[][] = []; // 结果数组
    // 注意排序的规则，特别是当两数相等时，k小的应该排前
    people.sort((peopleA: number[], peopleB: number[]) => {
        if (peopleA[0] === peopleB[0]) {
            return peopleA[1] - peopleB[1];
        } else {
            return peopleB[0] - peopleA[0];
        }
    });
    // 遍历一遍降序数组，按照人数来插入位置，因为目前的顺序已经是原有结果数组中的元素均大于当前元素
    for (let i = 0; i < people.length; i++) {
        res.splice(people[i][1], 0, people[i]);
    }
    return res;
};


// 这道题目考察的是对自定义排序规则的思考
// 本题有两个维度，h和k，看到这种题目一定要想如何确定一个维度，然后在按照另一个维度重新排列。
// 如果两个维度一起考虑一定会顾此失彼。
// 这道题困惑的点在于困惑的点是先确实k还是先确定h呢，也就是究竟先按h排序呢，还先按照k排序呢？
// 如果按照k来从小到大排序，排完之后，会发现k的排列并不符合条件，身高也不符合条件，两个维度哪一个都没确定下来。
// 那么按照身高h来排序呢，身高一定是从大到小排（身高相同k小的站前面），让高个子在前面。
// 这里要注意的地方在于当两者身高相同时，肯定是k小的站在前面，否则可能出现一些特殊情况：
// 即k大的先插入了，后面又来了个k小的插前面，导致后面k大的元素不满足题意了，反之则不会
// 此时我们可以确定一个维度了，就是身高，前面已经存在的节点一定都比本节点高。
// 在优先按照k来插入，后序插入节点也不会影响前面已经插入的节点，最终按照k的规则完成了队列。
